# 堆盘子。设想有一堆盘子，堆太高可能会倒下来。因此，在现实生活中，盘子堆到一定高度时，我们就会另外堆一堆盘子。
# 请实现数据结构SetOfStacks，模拟这种行为。
# SetOfStacks应该由多个栈组成，并且在前一个栈填满时新建一个栈。此外，SetOfStacks.push()和SetOfStacks.pop()应该与
# 普通栈的操作方法相同（也就是说，pop()返回的值，应该跟只有一个栈时的情况一样）。
# 进阶：实现一个popAt(int index)方法，根据指定的子栈，执行pop操作。
#  当某个栈为空时，应当删除该栈。当栈中没有元素或不存在该栈时，popAt 应返回 -1.
#
#  示例1:
#   输入：["StackOfPlates", "push", "push", "popAt", "pop", "pop"], [[1], [1], [2], [1], [], []]
#  输出：[null, null, null, 2, 1, -1]
#
#  示例2:
#   输入：["StackOfPlates", "push", "push", "push", "popAt", "popAt", "popAt"], [[2], [1], [2], [3], [0], [0], [0]]
#  输出：[null, null, null, null, 2, 1, 3]
class StackOfPlates:
    def __init__(self, cap: int):
        self.singleStackSize = cap
        self.stacks = []

    def push(self, val: int) -> None:  # 将元素push到最后一个一个栈中，如果最后的栈满了，需要新增一个栈(不需要考虑中间是否有未满的栈)
        if self.singleStackSize <= 0:
            return
        if not self.stacks or len(self.stacks[-1]) == self.singleStackSize:
            self.stacks.append([val])
        else:
            self.stacks[-1].append(val)

    def pop(self) -> int:
        if not self.stacks:
            return -1
        res = self.stacks[-1].pop()
        if not self.stacks[-1]:
            del self.stacks[-1]
        return res

    def popAt(self, index: int) -> int:
        if not self.stacks or index >= len(self.stacks):  # 所有栈都是空，或者索引越界
            return -1
        res = self.stacks[index].pop()
        if not self.stacks[index]:  # pop后给定索引栈为空，就需要将给定索引栈删掉
            del self.stacks[index]
        return res


if __name__ == '__main__':
    stack = StackOfPlates(2)
    stack.push(1)
    stack.push(2)
    stack.push(3)
    print(stack.popAt(0))
    print(stack.popAt(0))
    print(stack.popAt(0))
